/* *******************************************************************
 * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
 * All rights reserved.
 * This program and the accompanying materials are made available
 * under the terms of the Eclipse Public License v 2.0
 * which accompanies this distribution and is available at
 * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
 *
 * Contributors:
 *     PARC     initial implementation
 * ******************************************************************/

package org.aspectj.weaver.patterns;

import org.aspectj.weaver.UnresolvedType;
import org.aspectj.weaver.World;
import org.aspectj.weaver.reflect.ReflectionWorld;

public class SimpleScopeTest extends PatternsTestCase {

	public World getWorld() {
		return new ReflectionWorld(true, this.getClass().getClassLoader());
	}

	public void testTestScope() {
		SimpleScope scope = makeTestScope();

		FormalBinding formalBinding = scope.lookupFormal("i");
		assertEquals("i", formalBinding.getName());
		assertEquals("I", formalBinding.getType().getSignature());

		formalBinding = scope.lookupFormal("string");
		assertEquals("string", formalBinding.getName());
		assertEquals("Ljava/lang/String;", formalBinding.getType().getSignature());
	}

	public void test1() {
		SimpleScope scope = makeTestScope();
		UnresolvedType unresolvedType = scope.lookupType("void", null);
		System.out.println(unresolvedType);
	}

	public static final String[] ZERO_STRINGS = new String[0];

	private TestScope makeTestScope() {
		// i = int
		// string = String
		return new TestScope(new String[] { "int", "java.lang.String" }, new String[] { "i", "string" }, world);
	}
	//
	// public void testStaticMatch() {
	// checkMatch("java.lang.Object", "java.lang.Object", true);
	// checkMatch("java.lang.Object+", "java.lang.Object", true);
	// checkMatch("java.lang.Object+", "java.lang.String", true);
	// checkMatch("java.lang.String+", "java.lang.Object", false);
	// checkMatch("java.lang.Integer", "java.lang.String", false);
	//
	// checkMatch("java.lang.Integer", "int", false);
	//
	// checkMatch("java.lang.Number+", "java.lang.Integer", true);
	//
	// checkMatch("java..*", "java.lang.Integer", true);
	// checkMatch("java..*", "java.lang.reflect.Modifier", true);
	// checkMatch("java..*", "int", false);
	// checkMatch("java..*", "javax.swing.Action", false);
	// checkMatch("java..*+", "javax.swing.Action", true);
	//
	// checkMatch("*.*.Object", "java.lang.Object", true);
	// checkMatch("*.Object", "java.lang.Object", false);
	// checkMatch("*..*", "java.lang.Object", true);
	// checkMatch("*..*", "int", false);
	// checkMatch("java..Modifier", "java.lang.reflect.Modifier", true);
	// checkMatch("java.lang.reflect.Mod..ifier", "java.lang.reflect.Modifier", false);
	//
	// checkMatch("java..reflect..Modifier", "java.lang.reflect.Modifier", true);
	// checkMatch("java..lang..Modifier", "java.lang.reflect.Modifier", true);
	// checkMatch("java..*..Modifier", "java.lang.reflect.Modifier", true);
	// checkMatch("java..*..*..Modifier", "java.lang.reflect.Modifier", true);
	// checkMatch("java..*..*..*..Modifier", "java.lang.reflect.Modifier", false);
	// // checkMatch("java..reflect..Modifier", "java.lang.reflect.Modxifier", false);
	// checkMatch("ja*va..Modifier", "java.lang.reflect.Modifier", true);
	// checkMatch("java..*..Mod*ifier", "java.lang.reflect.Modifier", true);
	//
	// }
	//
	// // three levels:
	// // 0. defined in current compilation unit, or imported by name
	// // 1. defined in current package/type/whatever
	// // 2. defined in package imported by *
	// /**
	// * We've decided not to test this here, but rather in any compilers
	// */
	// public void testImportResolve() {
	// // checkIllegalImportResolution("List", new String[] { "java.util", "java.awt", },
	// // ZERO_STRINGS);
	//
	// }
	//
	// // Assumption for bcweaver: Already resolved type patterns with no *s or ..'s into exact type
	// // patterns. Exact type patterns don't have import lists. non-exact-type pattens don't
	// // care about precedence, so the current package can be included with all the other packages,
	// // and we don't care about compilation units, and we don't care about ordering.
	//
	// // only giving this wild-type patterns
	// public void testImportMatch() {
	//
	// checkImportMatch("*List", new String[] { "java.awt.", }, ZERO_STRINGS, "java.awt.List", true);
	// checkImportMatch("*List", new String[] { "java.awt.", }, ZERO_STRINGS, "java.awt.List", true);
	// checkImportMatch("*List", new String[] { "java.awt.", }, ZERO_STRINGS, "java.util.List", false);
	// checkImportMatch("*List", new String[] { "java.util.", }, ZERO_STRINGS, "java.awt.List", false);
	// checkImportMatch("*List", new String[] { "java.util.", }, ZERO_STRINGS, "java.util.List", true);
	//
	// checkImportMatch("*List", ZERO_STRINGS, new String[] { "java.awt.List", }, "java.awt.List", true);
	//
	// checkImportMatch("awt.*List", ZERO_STRINGS, new String[] { "java.awt.List", }, "java.awt.List", false);
	// checkImportMatch("*Foo", ZERO_STRINGS, new String[] { "java.awt.List", }, "java.awt.List", false);
	//
	// checkImportMatch("*List", new String[] { "java.util.", "java.awt.", }, ZERO_STRINGS, "java.util.List", true);
	// checkImportMatch("*List", new String[] { "java.util.", "java.awt.", }, ZERO_STRINGS, "java.awt.List", true);
	//
	// checkImportMatch("*..List", new String[] { "java.util." }, ZERO_STRINGS, "java.util.List", true);
	// checkImportMatch("*..List", new String[] { "java.util." }, ZERO_STRINGS, "java.awt.List", true);
	//
	// }
	//
	// public void testImportMatchWithInners() {
	// // checkImportMatch("*Entry", new String[] { "java.util.", "java.util.Map$" }, ZERO_STRINGS, "java.util.Map$Entry", true);
	// //
	// // checkImportMatch("java.util.Map.*Entry", ZERO_STRINGS, ZERO_STRINGS, "java.util.Map$Entry", true);
	// //
	// // checkImportMatch("*Entry", new String[] { "java.util.", }, ZERO_STRINGS, "java.util.Map$Entry", false);
	// //
	// // checkImportMatch("*.Entry", new String[] { "java.util.", }, ZERO_STRINGS, "java.util.Map$Entry", true);
	// //
	// // checkImportMatch("Map.*", new String[] { "java.util.", }, ZERO_STRINGS, "java.util.Map$Entry", true);
	//
	// checkImportMatch("Map.*", ZERO_STRINGS, new String[] { "java.util.Map" }, "java.util.Map$Entry", true);
	// }
	//
	// private void checkImportMatch(String wildPattern, String[] importedPackages, String[] importedNames, String matchName,
	// boolean shouldMatch) {
	// WildTypePattern p = makeResolvedWildTypePattern(wildPattern, importedPackages, importedNames);
	// checkPatternMatch(p, matchName, shouldMatch);
	// }
	//
	// private WildTypePattern makeResolvedWildTypePattern(String wildPattern, String[] importedPackages, String[] importedNames) {
	// WildTypePattern unresolved = (WildTypePattern) new PatternParser(wildPattern).parseTypePattern();
	//
	// WildTypePattern resolved = resolve(unresolved, importedPackages, importedNames);
	// return resolved;
	//
	// }
	//
	// private WildTypePattern resolve(WildTypePattern unresolved, String[] importedPrefixes, String[] importedNames) {
	//
	// TestScope scope = makeTestScope();
	// scope.setImportedPrefixes(importedPrefixes);
	// scope.setImportedNames(importedNames);
	// return (WildTypePattern) unresolved.resolveBindings(scope, Bindings.NONE, false, false);
	// }
	//

	//
	// public void testInstanceofMatch() {
	//
	// checkInstanceofMatch("java.lang.Object", "java.lang.Object", FuzzyBoolean.YES);
	//
	// checkIllegalInstanceofMatch("java.lang.Object+", "java.lang.Object");
	// checkIllegalInstanceofMatch("java.lang.Object+", "java.lang.String");
	// checkIllegalInstanceofMatch("java.lang.String+", "java.lang.Object");
	// checkIllegalInstanceofMatch("java.lang.*", "java.lang.Object");
	// checkInstanceofMatch("java.lang.Integer", "java.lang.String", FuzzyBoolean.NO);
	//
	// checkInstanceofMatch("java.lang.Number", "java.lang.Integer", FuzzyBoolean.YES);
	// checkInstanceofMatch("java.lang.Integer", "java.lang.Number", FuzzyBoolean.MAYBE);
	//
	// checkIllegalInstanceofMatch("java..Integer", "java.lang.Integer");
	//
	// checkInstanceofMatch("*", "java.lang.Integer", FuzzyBoolean.YES);
	//
	// }
	//
	// public void testArrayMatch() {
	// checkMatch("*[][]", "java.lang.Object", false);
	// checkMatch("*[]", "java.lang.Object[]", true);
	// checkMatch("*[][]", "java.lang.Object[][]", true);
	// checkMatch("java.lang.Object+", "java.lang.Object[]", true);
	// checkMatch("java.lang.Object[]", "java.lang.Object", false);
	// checkMatch("java.lang.Object[]", "java.lang.Object[]", true);
	// checkMatch("java.lang.Object[][]", "java.lang.Object[][]", true);
	// checkMatch("java.lang.String[]", "java.lang.Object", false);
	// checkMatch("java.lang.String[]", "java.lang.Object[]", false);
	// checkMatch("java.lang.String[][]", "java.lang.Object[][]", false);
	// checkMatch("java.lang.Object+[]", "java.lang.String[][]", true);
	// checkMatch("java.lang.Object+[]", "java.lang.String[]", true);
	// checkMatch("java.lang.Object+[]", "int[][]", true);
	// checkMatch("java.lang.Object+[]", "int[]", false);
	// }
	//
	// private void checkIllegalInstanceofMatch(String pattern, String name) {
	// try {
	// TypePattern p = makeTypePattern(pattern);
	// ResolvedType type = world.resolve(name);
	// p.matchesInstanceof(type);
	// } catch (Throwable e) {
	// return;
	// }
	// assertTrue("matching " + pattern + " with " + name + " should fail", false);
	// }
	//
	// private void checkInstanceofMatch(String pattern, String name, FuzzyBoolean shouldMatch) {
	// TypePattern p = makeTypePattern(pattern);
	// ResolvedType type = world.resolve(name);
	//
	// p = p.resolveBindings(makeTestScope(), null, false, false);
	//
	// // System.out.println("type: " + p);
	// FuzzyBoolean result = p.matchesInstanceof(type);
	// String msg = "matches " + pattern + " to " + type;
	// assertEquals(msg, shouldMatch, result);
	// }
	//
	//
	// private TypePattern makeTypePattern(String pattern) {
	// PatternParser pp = new PatternParser(pattern);
	// TypePattern tp = pp.parseSingleTypePattern();
	// pp.checkEof();
	// return tp;
	// }
	//
	// private void checkMatch(String pattern, String name, boolean shouldMatch) {
	// TypePattern p = makeTypePattern(pattern);
	// p = p.resolveBindings(makeTestScope(), null, false, false);
	// checkPatternMatch(p, name, shouldMatch);
	// }
	//
	// private void checkPatternMatch(TypePattern p, String name, boolean shouldMatch) {
	// ResolvedType type = world.resolve(name);
	// // System.out.println("type: " + type);
	// boolean result = p.matchesStatically(type);
	// String msg = "matches " + p + " to " + type + " expected ";
	// if (shouldMatch) {
	// assertTrue(msg + shouldMatch, result);
	// } else {
	// assertTrue(msg + shouldMatch, !result);
	// }
	// }
	//
	// public void testSerialization() throws IOException {
	// String[] patterns = new String[] { "java.lang.Object", "java.lang.Object+", "java.lang.Integer", "int", "java..*",
	// "java..util..*", "*.*.Object", "*", };
	//
	// for (int i = 0, len = patterns.length; i < len; i++) {
	// checkSerialization(patterns[i]);
	// }
	// }
	//
	// /**
	// * Method checkSerialization.
	// *
	// * @param string
	// */
	// private void checkSerialization(String string) throws IOException {
	// TypePattern p = makeTypePattern(string);
	// ByteArrayOutputStream bo = new ByteArrayOutputStream();
	// ConstantPoolSimulator cps = new ConstantPoolSimulator();
	// CompressingDataOutputStream out = new CompressingDataOutputStream(bo, cps);
	// p.write(out);
	// out.close();
	//
	// ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
	// VersionedDataInputStream in = new VersionedDataInputStream(bi, cps);
	// TypePattern newP = TypePattern.read(in, null);
	//
	// assertEquals("write/read", p, newP);
	// }

}
